// winutils.cpp
#include "winutils.h"
#include <QTimer>
#include <QString>
#include <QDebug>
#include <QElapsedTimer>


namespace WinUtils {

/**
 * 通用窗口查找函数
 * 通过窗口标题查找指定窗口
 * @param windowTitle 要查找的窗口标题
 * @return 找到的窗口句柄(HWND)，未找到时返回NULL
 */
HWND findWindowByTitle(const QString& windowTitle) {
    qDebug() << "查找窗口:" << windowTitle;
    const wchar_t* title = reinterpret_cast<const wchar_t*>(windowTitle.utf16());
    HWND hwnd = FindWindow(NULL, title);

    if (hwnd) {
        wchar_t className[256] = {0};
        if (GetClassName(hwnd, className, sizeof(className))) {
            qDebug() << "✓ 找到窗口:" << hwnd
                     << "标题:" << windowTitle
                     << "类名:" << QString::fromWCharArray(className);
        } else {
            qDebug() << "✓ 找到窗口:" << hwnd << "标题:" << windowTitle;
        }
    } else {
        qDebug() << "✗ 未找到窗口:" << windowTitle;
    }

    return hwnd;
}

/**
 * 启动应用并等待窗口出现
 * 使用定时器循环检测指定窗口是否出现，并在找到后进行窗口操作
 * @param parent 定时器的父对象，用于内存管理
 * @param windowTitle 要等待的窗口标题
 * @param timeoutMs 最大等待时间（毫秒）
 * @param intervalMs 检查间隔（毫秒）
 */
void startAndWaitForWindow(QObject* parent,
                           const QString& windowTitle,
                           int timeoutMs,
                           int intervalMs) {
    qDebug() << "等待窗口出现:" << windowTitle
             << "超时时间:" << timeoutMs << "ms"
             << "检查间隔:" << intervalMs << "ms";

    // 使用智能指针管理定时器和计时器
    QTimer* timer = new QTimer(parent);
    QElapsedTimer* elapsedTimer = new QElapsedTimer();
    elapsedTimer->start();

    // 使用局部变量替代动态分配的计数器
    int attempt = 0;

    // 使用单次连接，窗口找到后自动断开
    QMetaObject::Connection* connection = new QMetaObject::Connection;
    *connection = QObject::connect(timer, &QTimer::timeout, parent, [timer, elapsedTimer, attempt, windowTitle, timeoutMs, intervalMs, connection]()mutable  {
        attempt++;
        qDebug() << "检查窗口状态 #" << attempt << "- 已过去:" << elapsedTimer->elapsed() << "ms";
        Q_UNUSED(intervalMs); // 声明未使用变量

        HWND hwnd = findWindowByTitle(windowTitle);
        if (hwnd) {
            qDebug() << "✅ 窗口已找到，句柄:" << hwnd;

            // 窗口操作
            if (!IsWindowVisible(hwnd)) {
                qDebug() << "窗口不可见，尝试显示";
                ShowWindow(hwnd, SW_SHOW);
            }

            if (!SetForegroundWindow(hwnd)) {
                qWarning() << "无法激活窗口，错误码:" << GetLastError();
            }

            if (!ShowWindow(hwnd, SW_MAXIMIZE)) {
                qWarning() << "无法最大化窗口，错误码:" << GetLastError();
            }

            // 清理资源
            timer->stop();
            QObject::disconnect(*connection);
            delete connection;
            delete elapsedTimer;
            qDebug() << "定时器已停止，资源已清理";
        }
        else if (elapsedTimer->elapsed() >= timeoutMs) {
            qWarning() << "❌ 超时未找到窗口:" << windowTitle;
            timer->stop();
            QObject::disconnect(*connection);
            delete connection;
            delete elapsedTimer;
            qDebug() << "定时器已停止（超时），资源已清理";
        }
    });

    timer->start(intervalMs);
    qDebug() << "定时器已启动，间隔:" << intervalMs << "ms";
}

} // namespace WinUtils
